package com.xbongbong.paas.model;

import com.xbongbong.paas.domain.entity.FormNumForOneApplicationEntity;
import com.xbongbong.paas.domain.entity.OneFormMaxListTypeNumEntity;
import com.xbongbong.paas.domain.entity.PaasFormEntity;
import com.xbongbong.paas.domain.entity.ext.OptionalRangeEntity;
import com.xbongbong.paas.domain.entity.ext.PaasFormEntityExt;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.paas.toolbox.wrap.UserVO;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * PAAS 表单类
 *
 * @author wufeng
 * @time 2018-8-8 9:47
 */
public interface PaasFormModel extends IModel<PaasFormEntity> {

    /**
     * 插入实体
     *
     * @param entity 实体
     *
     * @return Integer MyBatis操作结果 1：成功
     */
    @Override
    Integer insert(PaasFormEntity entity);

    /**
     * 批量插入实体
     * @param list
     * @return 返回数据的列表
     */
    List<PaasFormEntity> insertBatch(List<PaasFormEntity> list);

    /**
     * 批量插入实体
     * @author 吴峰
     * @date 2019/2/19 19:30
     * @param list
     * @param corpid
     * @return java.util.List<com.xbongbong.paas.domain.entity.PaasFormEntity>
     */
    List<PaasFormEntity> updateBatch(List<PaasFormEntity> list, String corpid);

    /**
     * 批量插入实体
     * @author 吴峰
     * @date 2019/2/19 19:30
     * @param list
     * @param corpid
     * @return java.util.List<com.xbongbong.paas.domain.entity.PaasFormEntity>
     */
    List<PaasFormEntityExt> initBatch(List<PaasFormEntityExt> list, String corpid);

    /**
     *  查询列表
     * @author wufeng
     * @date 2018/8/13 16:07
     * @param entity
     * @descption
     * @return java.util.List<ApplicationListVO>
     */
    List<PaasFormEntityExt> list(Map<String, Object> entity);

    /**
     * 查询列表
     * @author  jiyonghui
     * @date 2019/11/21
     * @param entity
     * @return
     */
    @Override
    List<PaasFormEntityExt> findEntitys(Map<String,Object> entity);

    /**
     * 查询列表
     * @date 2019/11/21
     * @param entity
     * @return
     */
    List<PaasFormEntity> findEntity(Map<String,Object> entity);

    /**
     * 查询单个实体
     * @param key
     * @param corpid
     * @return
     */
    PaasFormEntityExt getByKey(Long key, String corpid);

    /**
     * 注意：paas专用
     * 通过菜单id查询单个实体
     * @param key
     * @param corpid
     * @return
     */
    PaasFormEntityExt getByMenuId(Long key, String corpid);

    /**
     * 通过菜单id和业务类型查询单个实体
     * @param key
     * @param corpid
     * @param businessType
     * @return
     * @author long.rao
     * @date 2019-02-16 15:00
     */
    PaasFormEntityExt getByMenuIdAndBusinessType(Integer key, String corpid, Integer businessType);

    /**
     *  查询列表数量
     * @author wufeng
     * @date 2018/8/13 16:07
     * @param entity
     * @descption
     * @return Integer
     */
    @Override
    Integer getEntitysCount(Map<String, Object> entity);

    /**
     * 删除实体
     * @author wufeng
     * @date 2018/8/6 17:18
     * @param key 表单id
     * @param corpid 公司id
     * @descption
     * @return java.lang.Integer  mybatis操作结果，1：成功
     */
    Integer delete(Long key, String corpid);

    /**
     *  更新实体
     * @author wufeng
     * @date 2018/8/13 10:19
     * @param entity
     * @descption
     * @return java.lang.Integer
     */
    @Override
    Integer update(PaasFormEntity entity);

    /**
     * 更新表单名称
     * @param entity
     * @return
     */
    Integer updateName(PaasFormEntity entity);

    /**
     * 用户表单列表
     * @param map
     * @return
     */
    List<PaasFormEntityExt> userFormList(Map<String,Object> map);

    /**
     * 更新标题
     * @param paasFormEntity
     * @return
     */
    Integer updateCustomTitle(PaasFormEntity paasFormEntity);

    /**
     * 根据appId删除表单
     * @param paasFormEntity
     * @return
     */
    Integer deleteByMenuId(PaasFormEntity paasFormEntity);

    /**
     * Description: 根据公司id和businessType获取 启用的模板
     * @param corpid 公司id
     * @param businessType  参见RedundantTemplateTypeEnum
     * @return java.util.List<com.xbongbong.paas.domain.entity.ext.PaasFormEntityExt>
     * @author 魏荣杰
     * @date 2019/2/14 16:26
     * @since v1.0
     *
     */
    List<PaasFormEntityExt> getEnableFormList(String corpid, Integer businessType);

    /**
     * Description: 根据公司id和businessType获取 启用的模板
     * @param corpid 公司id
     * @param businessType  参见RedundantTemplateTypeEnum
     * @return java.util.List<com.xbongbong.paas.domain.entity.ext.PaasFormEntityExt>
     * @author 吴峰
     * @date 2019/2/14 16:26
     * @since v1.0
     *
     */
    List<PaasFormEntityExt> getEnableFormList(String corpid, Integer businessType, String columns);

    List<PaasFormEntityExt> getEnableFormListDistributor(String corpid, Integer businessType,Integer distributorMark);

    List<PaasFormEntityExt> getFormListDistributor(String corpid, Integer businessType,Integer distributorMark);

    PaasFormEntityExt getByBusinessType(Integer businessType, String corpid);

    PaasFormEntityExt getByBusinessType4Distributor(Integer businessType, String corpid, Integer distributor, String columns);

    List<Long> getFormIdList4Distributor(Integer businessType, String corpid, Integer distributor);

    /**
     * 通过businessType获取，可限定返回值
     * @param businessType
     * @param corpid
     * @param columns
     * @return
     */
    PaasFormEntityExt getByBusinessType(Integer businessType, String corpid, String columns);

    List<PaasFormEntityExt> getByBusinessTypes(Map<String, Object> param);

    /**
     * 开启关闭业绩分配
     *
     * @param key 表单id
     * @param corpid 公司id
     * @param openDistribution 是否开启，1为开启，0为关闭
     * @return 是否成功
     */
    Integer updateDistribution(Long key, String corpid, Integer openDistribution);

    /**
     * 单应用最大表单类型数
     * @param corpid 公司id
     * @return
     * 创建时间 2019/3/27 10:14 AM
     * 修改时间 2019/3/27 10:14 AM
     * @author chy
     * @since v1.0
     * @version v1.0
     */
    FormNumForOneApplicationEntity getOneApplicationMaxFormTypeNum(String corpid);

    /**
     * 单表单最大列表类型数
     * @param corpid 公司id
     * @return
     * 创建时间 2019/3/27 2:08 PM
     * 修改时间 2019/3/27 2:08 PM
     * @author chy
     * @since v1.0
     * @version v1.0
     */
    OneFormMaxListTypeNumEntity getOneFormMaxListTypeNum(String corpid);

    /**
     * 根据业务类型查询没有钉钉待办模板的表单信息
     * @param map
     * @return
     * @throws
     * @author xingxing.xiao
     * @date 2019/07/19 18:12
     */
    List<PaasFormEntityExt> getFormWithoutProcessCodeByBusinessType(Map<String, Object> map);

    Long getFormIdByBusinessType(String corpid, int businessType);

    /**
     * 获取已启用的表单
     * @param corpid 公司id
     * @return
     * @throws
     * @author hongxiao
     * @date 2019-07-30 10:24
     * @since v1.0
     * @version v1.0
     */
    List<PaasFormEntityExt> getEnableList(String corpid);

    /**
     * 慎用！！！如果分库后则强制不能使用该方法！！！
     * 因为，该方法没有限制corpid（专门给资金管理改造一期使用：批量更新线上的回款单menuId）
     * 批量更新表单：回款单的menuId
     * @param list
     * @return java.lang.Integer
     * @author zcp
     * @date 19/11/4 004 21:57
     * @update 19/11/4 004 21:57
     * @since v1.0
     * @version v1.0
     */
    Integer updateBatchTemp(List<PaasFormEntityExt> list) throws XbbException;

    PaasFormEntityExt getByBusinessTypeNoEnable(int businessType, String corpid);

    /**
     * 批量更新del
     * @param del
     * @param updateTime
     * @param idIn
     * @param corpid
     */
    void batchUpdateDel(Integer del, Integer updateTime,List<Long> idIn, String corpid);
    /**
     * 批量删除
     * @param list 主键id集合
     * @param corpid
     * @author xingxing.xiao
     */
    Integer deleteBatch(List<Long> list, String corpid);

    /**
     * 批量更新业务规则(主要是镜像用来把business_rules改为1)
     * @param list 主键id集合
     * @param corpid
     * @param businessRules
     * @author xingxing.xiao
     */
    Integer updateBusinessRuleBatch(List<Long> list, String corpid, String businessRules);

    Integer deleteBatchByMenuId(List<Long> list, String corpid);

    PaasFormEntity getByFormId(Long menuId, String corpid);

    List<PaasFormEntityExt> getByIdIn(Set<Long> formIds, String corpid);

    List<PaasFormEntityExt> getEnableFormList(String corpid, List<Integer> businessTypes);

    /**
     * 获取权限下启用工作报告
     * @param loginUser
     * @param appId
     * @param o
     * @return
     */
    List<PaasFormEntityExt> getWorkReportTemplateWithPermission(String corpid, UserVO loginUser, Long appId, Object o);

    /**
     * 根据权限 删除没有权限的表单
     * @param paasFormEntityList
     * @param loginUser
     * 创建时间 2019/6/7 4:03 PM
     * 修改时间 2019/6/7 4:03 PM
     * @author chy
     * @since v1.0
     * @version v1.0
     */
    void removeByPermission(List<PaasFormEntityExt> paasFormEntityList, UserVO loginUser);


    /**
     * 校验当前用户使用有使用表单的权限
     * @param paasFormEntityExt
     * @param loginUser
     * 创建时间 2019/6/7 4:03 PM
     * 修改时间 2019/6/7 4:03 PM
     * @author chy
     * @since v1.0
     * @version v1.0
     */
    void validateByPermission(PaasFormEntityExt paasFormEntityExt, UserVO loginUser) throws XbbException;

    /**
     * 根据权限进行判断
     * 根据表单实体中permission属性进行判断，其中有sql查部门信息，请慎用循环调用该方法
     * @param permissionList
     * @param loginUser
     * @return
     */
    boolean getPermission(List<OptionalRangeEntity> permissionList, UserVO loginUser);
    /**
     * 获取表单数组
     *
     * @param formIdList  表单id数组
     * @param corpid 公司id
     * @return  实体中目前只有id跟name的值
     * @author zyy
     * @date 2022/4/1
     * @version v1.0
     */
    List<PaasFormEntity> getNameByKeys(List<Long> formIdList, String corpid);

    PaasFormEntityExt getByKeyIncludeDel(Long key, String corpid);

    List<PaasFormEntityExt> getByPermission(String corpid, Integer businessType, UserVO userVO);

    /**
     * 获取子产品插入的表单列表
     * @param mainBusinessFormList
     * @param allBusinessTypes
     * @return void
     * @author wangtengwei
     * @date 2022/10/28 14:15
     * @throws XbbException
     */
    void insertSubProductFormList(List<PaasFormEntity> mainBusinessFormList, Set<Integer> allBusinessTypes);
}
